﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crosland.Automotriz.Core;

namespace Crosland.Automotriz.Data.Dao.Linq
{
    public class clsT_Log_Canibalizacion_Movimiento_CabDAO
    {

        private AutomotrizEntities ContextoDeObjs = new AutomotrizEntities();

        public IEnumerable<Object> Listar()
        {
            using (ContextoDeObjs)
            {
                var datos = (from p in ContextoDeObjs.T_LOG_CANIBALIZACION_MOVIMIENTO_CAB
                             join tlcc in ContextoDeObjs.T_LOG_CANIBALIZACION_CAB on p.ID_LOG_CANIBALIZACION_CAB.Value equals tlcc.ID_LOG_CANIBALIZACION_CAB
                             from  tve in ContextoDeObjs.TD_VEHICULOS                            
                             join c in ContextoDeObjs.T_MAE_TABLA_GENERAL_DET on p.TIPO_MOVIMIENTO.Value equals c.ID_GENERAL_DET
                             join t in ContextoDeObjs.T_MAE_TABLA_GENERAL_DET on p.ID_TECNICO.Value equals t.ID_GENERAL_DET into tecnico
                             from s in tecnico.DefaultIfEmpty()
                             where tlcc.NRO_LOTE == tve.NRO_LOTE && tlcc.NRO_MOTOR == tve.NRO_MOTOR && tlcc.VIN == tve.NRO_CHASIS

                             select new
                             {
                                 p.TIPO_MOVIMIENTO,
                                 p.USUARIO,
                                 p.ID_LOG_CANIBALIZACION_CAB,
                                 p.ID_LOG_CANIB_MOV_CAB,
                                 p.FECHA_CANIBALIZACION,
                                 p.DESCRIPCION,
                                 c.DES_CORTA,
                                 tlcc.DES_COLOR,
                                 tve.DES_MARCA,
                                 tve.DES_MODELO,
                                 tlcc.VIN,
                                 tlcc.NRO_MOTOR,
                                 TECNICO=s.DES_CORTA,
                                 p.ES_ANULADO
                                 
                                
                             }).ToList();


                return datos;
            }
        }




        public bool Insertar(T_LOG_CANIBALIZACION_MOVIMIENTO_CAB Obj)
        {
            try
            {
                ContextoDeObjs.AddObject("T_LOG_CANIBALIZACION_MOVIMIENTO_CAB", Obj);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        public bool Modificar(T_LOG_CANIBALIZACION_MOVIMIENTO_CAB obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("T_LOG_CANIBALIZACION_MOVIMIENTO_CAB", obj);
                ContextoDeObjs.ObjectStateManager.ChangeObjectState(obj, System.Data.EntityState.Modified);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;

            }
            return true;
        }

        public bool Eliminar(T_LOG_CANIBALIZACION_MOVIMIENTO_CAB obj)
        {
            try
            {
                ContextoDeObjs.AttachTo("T_LOG_CANIBALIZACION_MOVIMIENTO_CAB", obj);
                ContextoDeObjs.DeleteObject(obj);
                ContextoDeObjs.SaveChanges();
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }



        public int UltimoGenerado()
        {
            try
            {
                var queryText = String.Format("declare @id_cabecera int SELECT @id_cabecera=IDENT_CURRENT ('T_LOG_CANIBALIZACION_MOVIMIENTO_CAB') select @id_cabecera");
                var lisr = ContextoDeObjs.ExecuteStoreQuery<int>(queryText).ToList();
                return lisr.FirstOrDefault();
            }
            catch (Exception)
            {
                return 0;
            }
        }



        public IEnumerable<object> ListaTipoMovimiento()
        {
            IEnumerable<object> lista = new List<object>();
            var q = from c in ContextoDeObjs.T_MAE_TABLA_GENERAL_CAB
                    join d in ContextoDeObjs.T_MAE_TABLA_GENERAL_DET on c.ID_GENERAL_CAB equals d.ID_GENERAL_CAB
                    where c.NOM_TABLA == "T_LOG_CANIBALIZACION_TIPO_MOVIMIENTO"
                    select new
                    {
                        d.ID_GENERAL_DET,
                        d.DES_CORTA,
                    };
            lista = q.ToList();
            return lista;
        }




        public T_LOG_CANIBALIZACION_MOVIMIENTO_CAB ListarPorIdCab(int intIdCab)
        {
            List<T_LOG_CANIBALIZACION_MOVIMIENTO_CAB> lista = new List<T_LOG_CANIBALIZACION_MOVIMIENTO_CAB>();
            var q = from c in ContextoDeObjs.T_LOG_CANIBALIZACION_MOVIMIENTO_CAB
                    where c.ID_LOG_CANIB_MOV_CAB == intIdCab
                    select c;
            lista = q.ToList();
            return lista[0];
        }


        public List<T_LOG_CANIBALIZACION_MOVIMIENTO_CAB_EN> listarPorIdLogCanibalizacionCab(int idCab)
        {
            try
            {
                List<T_LOG_CANIBALIZACION_MOVIMIENTO_CAB_EN> lista = new List<T_LOG_CANIBALIZACION_MOVIMIENTO_CAB_EN>();
                var sqlText = "SELECT tlcmc.ID_LOG_CANIB_MOV_CAB,tlcmc.ES_ANULADO,tlcmc.ID_LOG_CANIBALIZACION_CAB,TIPO_MOVIMIENTO=tmtgd.DES_CORTA,ID_TIPO_MOVIMIENTO= tlcmc.TIPO_MOVIMIENTO, " +
                                "tlcmc.FECHA_CANIBALIZACION,tlcmc.USUARIO,tlcmc.DESCRIPCION, tlcc.VIN,tlcc.NRO_MOTOR,tv.DES_MARCA,tv.DES_MODELO,tlcc.DES_COLOR, "+
                                "NUMERO_ARTICULOS=(SELECT COUNT(*) FROM T_LOG_CANIBALIZACION_MOV_DET tlcmd WHERE tlcmd.ID_LOG_CANIB_MOV_CAB=tlcmc.ID_LOG_CANIB_MOV_CAB), "+
                                "IMPORTE_FOB=(SELECT SUM(tlcmd.CANTIDAD*tlcmd.FOB) FROM T_LOG_CANIBALIZACION_MOV_DET tlcmd WHERE tlcmd.ID_LOG_CANIB_MOV_CAB=tlcmc.ID_LOG_CANIB_MOV_CAB), "+
                                "COSTO_S=(SELECT MAX(tlcmd.CUP_S) FROM T_LOG_CANIBALIZACION_MOV_DET tlcmd WHERE tlcmd.ID_LOG_CANIB_MOV_CAB=tlcmc.ID_LOG_CANIB_MOV_CAB)," +
                                "COSTO_D=(SELECT MAX(tlcmd.CUP_D) FROM T_LOG_CANIBALIZACION_MOV_DET tlcmd WHERE tlcmd.ID_LOG_CANIB_MOV_CAB=tlcmc.ID_LOG_CANIB_MOV_CAB)" +
                                "FROM T_LOG_CANIBALIZACION_MOVIMIENTO_CAB tlcmc  "+
                                "INNER JOIN T_LOG_CANIBALIZACION_CAB tlcc ON tlcc.ID_LOG_CANIBALIZACION_CAB = tlcmc.ID_LOG_CANIBALIZACION_CAB "+ 
                                "INNER JOIN TD_VEHICULOS tv ON tv.NRO_LOTE = tlcc.NRO_LOTE  "+
                                "INNER JOIN T_MAE_TABLA_GENERAL_DET tmtgd ON tlcmc.TIPO_MOVIMIENTO=tmtgd.ID_GENERAL_DET  "+
                                "WHERE tlcmc.ID_LOG_CANIBALIZACION_CAB =" + idCab;
                var q = ContextoDeObjs.ExecuteStoreQuery<T_LOG_CANIBALIZACION_MOVIMIENTO_CAB_EN>(sqlText);
                lista = q.ToList();
                return lista;
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }



        public int Total_Saldo(int IdLogCanibalizacionCab)
        {
            try
            {
                var q = "SELECT TOTAL_SALDO=SUM(CASE WHEN tlcmc.TIPO_MOVIMIENTO=151 THEN tlcmd.CANTIDAD ELSE 0 END)-SUM(CASE WHEN tlcmc.TIPO_MOVIMIENTO=150 THEN tlcmd.CANTIDAD ELSE 0 END) "+
                        "FROM T_LOG_CANIBALIZACION_MOV_DET tlcmd "+
                        "INNER JOIN T_LOG_CANIBALIZACION_MOVIMIENTO_CAB tlcmc ON tlcmc.ID_LOG_CANIB_MOV_CAB = tlcmd.ID_LOG_CANIB_MOV_CAB "+
                        "INNER JOIN T_LOG_CANIBALIZACION_CAB tlcc ON tlcc.ID_LOG_CANIBALIZACION_CAB = tlcmc.ID_LOG_CANIBALIZACION_CAB "+
                        "INNER JOIN T_MAE_TABLA_GENERAL_DET tmtgd ON tmtgd.ID_GENERAL_DET=tlcmc.TIPO_MOVIMIENTO "+
                        "WHERE tlcc.ID_LOG_CANIBALIZACION_CAB="+IdLogCanibalizacionCab;
                var resultado = ContextoDeObjs.ExecuteStoreQuery<int>(q).ToList();
                return resultado.FirstOrDefault();
            }
            catch (Exception)
            {
                return 999999999;
            }
        }


        public Nullable<DateTime> fecha_canibalizacion(int IdLogCanibalizacionCab)
        {
            try
            {
                var q = "SELECT TOP 1  tlcmc.FECHA_CANIBALIZACION FROM T_LOG_CANIBALIZACION_MOVIMIENTO_CAB tlcmc "+
                        "WHERE  tlcmc.TIPO_MOVIMIENTO=151 AND  tlcmc.ID_LOG_CANIBALIZACION_CAB=" + IdLogCanibalizacionCab +
                        "ORDER BY tlcmc.ID_LOG_CANIB_MOV_CAB";
                var resultado = ContextoDeObjs.ExecuteStoreQuery<DateTime>(q).ToList();
                return resultado.FirstOrDefault();
            }
            catch (Exception)
            {
                return null ;
            }     
        
        }


        public Nullable<DateTime> fecha_armado(int IdLogCanibalizacionCab)
        {
            try
            {
                var q = "SELECT TOP 1 tlcmc.FECHA_CANIBALIZACION "+
                        "FROM T_LOG_CANIBALIZACION_MOVIMIENTO_CAB tlcmc "+
                        "WHERE tlcmc.TIPO_MOVIMIENTO=150 and tlcmc.ID_LOG_CANIBALIZACION_CAB=" + IdLogCanibalizacionCab +
                        "ORDER BY tlcmc.ID_LOG_CANIB_MOV_CAB DESC";
                var resultado = ContextoDeObjs.ExecuteStoreQuery<DateTime>(q).ToList();
                return resultado.FirstOrDefault();
            }
            catch (Exception)
            {
                return null;
            }
        }



        public bool Anular(int id) {
            try
            {
             ContextoDeObjs.ExecuteStoreCommand("UPDATE T_LOG_CANIBALIZACION_MOVIMIENTO_CAB SET ES_ANULADO = 1  WHERE ID_LOG_CANIB_MOV_CAB=" + id);
            }
            catch (Exception ex)
            {                
                throw ex;
            }
            return true;        
        }


        public IEnumerable<Object> ListaTecnico() {

            IEnumerable<Object> lista = new List<Object>();

            var q =from t in ContextoDeObjs.T_MAE_TABLA_GENERAL_DET
                    join m in ContextoDeObjs.T_MAE_TABLA_GENERAL_CAB on t.ID_GENERAL_CAB equals m.ID_GENERAL_CAB
                    where m.NOM_TABLA == "T_LOG_CANIBALIZACION_TECNICO"
                    select new {                     
                    t.ID_GENERAL_DET,
                    t.DES_CORTA                    
                    };

            lista = q.ToList();
            return lista;



        }




    }
}
